#include <stdio.h>
#include <stdlib.h>

typedef int HElemSet;
typedef int Position; /* 数组下标即为元素位置 */
typedef struct BinaryHeapNode *MaxHeap;
typedef struct BinaryHeapNode *MinHeap;
struct BinaryHeapNode {
    HElemSet *data; /* 数据元素数组 */
    int size; /* 规模 */
    int capacity; /* 容量 */
};

/* 线性表定义 */
#define kMaxSize 10000
#define NIL -1
typedef HElemSet ElemSet;

typedef int Position; /* 整型下标，表示元素的位置 */
typedef struct ListNode *List;
struct ListNode {
    ElemSet data[kMaxSize]; /* 存储数据的数组 */
    Position last; /* 线性表中最后一个元素在数组中的位置 */
};

void InitList(List list) {
    list->last = -1;
}
/* 线性表定义结束 */

void InitPQueue(MinHeap pq, int capacity) {
    pq->capacity = capacity;
    pq->size = 0;
    pq->data = (HElemSet *)malloc(sizeof(HElemSet) * capacity);
}

void SiftUp(MinHeap h, Position i) {
    HElemSet elem;

    elem = h->data[i];
    while (i > 1 && elem < h->data[i >> 1]) { /* 当前结点小于其父结点 */
        h->data[i] = h->data[i >> 1]; /* 将i的父结点元素下移 */
        i >>= 1; /* i指向原结点的父结点，即向上调整 */
    }
    h->data[i] = elem;
}

/* 算法6-5：二叉堆的朴素建堆操作 MakeHeapUp(h) */
void MakeHeapUp(MinHeap h) {
    Position last;
    int i;

    last = h->size; /* 这是最后一个元素的位置 */
    for (i = 2; i <= last; i++) { /* 相当于顺次插入元素 */
        SiftUp(h, i);
    }
}
/* 算法6-5 结束 */

void MakePQueue(MinHeap h, List list) {
    /* 以 list 中所有元素创建一个优先级队列 pq */
    int n, i;

    n = list->last + 1; /* 获得表长 */
    for (i = 0; i < n; i++) {
        h->data[i + 1] = list->data[i]; /* 复制list到pq中 */
    }
    h->size = n;
    MakeHeapUp(h); /* 朴素建堆 */
}

int main(void) {
    MinHeap h;
    List list;
    int capacity, n, i;
    HElemSet x;

    h = (MinHeap)malloc(sizeof(struct BinaryHeapNode));
    scanf("%d", &capacity);
    InitPQueue(h, capacity);
    list = (List)malloc(sizeof(struct ListNode));
    InitList(list);
    scanf("%d", &n);
    for (i = 0; i < n; i++) {
        scanf("%d", &list->data[i]); /* 读入一个线性表 */
        list->last++;
    }
    MakePQueue(h, list);
    for (i = 1; i <= h->size; i++) { /* 输出调整后的堆元素 */
        printf("%d\n", h->data[i]);
    }
    return 0;
}